package base

import (
	"encoding/json"
	"fmt"
	"github.com/gin-gonic/gin"
	"gorm.io/driver/mysql"
	_ "gorm.io/driver/mysql"
	"gorm.io/gorm"
	"os"
	"shejiao/common/model/common"
	user2 "shejiao/common/model/user"
	"shejiao/pkg/config"
	"shejiao/pkg/match"
	"time"
)

func InitConfig(path string) *config.Config {
	file, err := os.Open(path)
	if err != nil {
		panic("配置文件打开失败")
	}
	defer file.Close()

	var cfg *config.Config
	decoder := json.NewDecoder(file)
	err = decoder.Decode(&cfg)
	if err != nil {
		panic("配置文件json格式有误，解析失败")
	}
	return cfg
}

func InitGorm(host, username, password string, port int64, dbname string) *gorm.DB {
	dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8mb4&parseTime=True&loc=Local", username, password, host, port, dbname)
	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
	if err != nil {
		panic("mysql 链接失败")
	}

	db.AutoMigrate(&user2.UserAuth{}, &user2.UserInfo{}, &user2.UserMatchRecorder{}, &user2.UserToken{}, &common.Goods{}, &common.Config{}, &common.Report{})
	db.AutoMigrate(&common.Suggest{}, &common.SystemNotice{}, &common.Region{})

	// 初始化商品表
	var goods common.Goods
	db.Find(&goods)
	if goods.Id == 0 {
		now := time.Now()
		db.Create(&common.Goods{DmdCnt: 1, Price: 100, Tag: "首充特惠", CreateAt: now.Unix()})
		db.Create(&common.Goods{DmdCnt: 3, Price: 300, Tag: "", CreateAt: now.Unix()})
		db.Create(&common.Goods{DmdCnt: 6, Price: 600, Tag: "", CreateAt: now.Unix()})
		db.Create(&common.Goods{DmdCnt: 10, Price: 1000, Tag: "", CreateAt: now.Unix()})
		db.Create(&common.Goods{DmdCnt: 30, Price: 3000, Tag: "", CreateAt: now.Unix()})
		db.Create(&common.Goods{DmdCnt: 100, Price: 10000, Tag: "", CreateAt: now.Unix()})
	}

	// 初始化配置表
	var configModel common.Config
	db.Find(&configModel)
	if configModel.Id == 0 {
		db.Create(&common.Config{Key: common.ConfigKeyCallCnt, IsShowFront: 1, Type: common.ConfigTypeInt, ValueInt: 10})
		db.Create(&common.Config{Key: common.ConfigKeyChatCnt, IsShowFront: 1, Type: common.ConfigTypeInt, ValueInt: 10})
		db.Create(&common.Config{Key: common.ConfigKeySystemNotice, IsShowFront: 1, Type: common.ConfigTypeString, ValueString: "本服务协议为您(也称“用户”，包括任何方式使用xxx服务的人，不限于自然人或机构)与xxxx网络科技有限公司之间关于使用假装情侣充值服务所达成的协议(以下简称“本协议”)。在您使用假装情侣充值服务前，请审慎阅读并充分理解以下所述条款的内容，特别是限制、排除或者免除责任的条款，限制、排除或者免责条款将以对字体加粗的形式提示您注意。 除非您完全接受本协议的全部条款并同意按照页面上的提示完成全部充值程序(注:如xxx有针对各项不定时推出的活动发布规则的，则您应该在同时认可该活动规则的前提下参与该活动)，否则请不要使用本服务。您选择进行充值、使用赠送或消费等本充值服务相关功能的，即视为您已充分理解并同意签署本协议，承诺作为协议的一方当事人接受本协议的约束。如果您对本协议的任何条款有疑问、存有异议或者无法准确理解本协议任何条款，您可以联系我们(jiazql@iftech.io)，我们将尽快为您解答。 为保障服务的稳定安全，充值成功后，除非符合相关法律法规规定的情形或经由相关部门判定，否则甜甜聊不支持将充值成功后的虚拟货币兑换为法定货币的逆向兑换服务，且若您有相关主张，则您负有向假装情侣提供对应有效证明的责任。基于此，假装情侣特别提示您: 1.未成年用户(指未满18周岁的未成年人，下同)应当在监护人陪同下阅读本协议，并应在监护人的许可及/或陪同下操作。未成年用户使用本服务的，xxx将视该用户已征得父母或其他监护人的同意。 2.下面还有其他服务，但是我不知道写什么，到时候你们问老板吧"})
	}

	// 初始化省
	var region common.Region
	db.Find(&region)
	if region.Id == 0 {
		regionList := []string{"北京市", "天津市", "河北省", "山西省", "内蒙古自治区", "辽宁省", "吉林省", "黑龙江省", "上海市", "江苏省", "浙江省", "安徽省", "福建省", "江西省", "山东省", "河南省", "湖北省", "湖南省", "广东省", "广西壮族自治区", "海南省", "重庆市", "四川省", "贵州省", "云南省", "西藏自治区", "陕西省"}
		for _, v := range regionList {
			db.Create(&common.Region{Name: v})
		}
	}
	return db
}

func InitUserMatchManagerRegion(db *gorm.DB) *match.UserMatchManagerRegion {
	var region []common.Region
	db.Find(&region)

	rgList := make([]string, 0)
	for _, v := range region {
		rgList = append(rgList, v.Name)
	}
	return match.NewUserMatchManagerRegion(rgList)
}

func InitHttp(handle func(ctx *gin.Engine), port int64) {
	c := gin.Default()
	handle(c)
	err := c.Run(fmt.Sprintf(":%d", port))
	if err != nil {
		panic("http 服务启动失败")
	}
}
